package ar.com.source.dao;

import java.sql.Time;
import java.util.LinkedList;
import java.util.List;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import ar.com.source.dominio.DiaExcel;
import ar.com.source.dominio.Empleado;
import ar.com.source.dto.DiasAlertaDTO;
import ar.com.source.dto.EmpleadoDTO;
import ar.com.source.rowMapper.DiasAlertaRowMapper;
import ar.com.source.rowMapper.DiasRowMapper;
import ar.com.source.rowMapper.EmpleadoRowMapper;
import ar.com.source.rowMapper.HoraRowMapper;

public class EmpleadoDAO {

	private JdbcTemplate jdbcTemplate;

	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	public void guardarEmpleados(LinkedList<EmpleadoDTO> empleados) {

		for (EmpleadoDTO empleadoDTO : empleados) {

			try {
				String sql = "select * from Empleado where legajo=?";
				Empleado queryForObject = jdbcTemplate.queryForObject(sql,
						new Object[] { empleadoDTO.getLegajo() },
						new EmpleadoRowMapper());
				// TODO FALTA PARA AGREGAR A LOS USUARIOS VIEJOS

			} catch (EmptyResultDataAccessException e) {

				insertarNuevoEmpleado(empleadoDTO);
			}

		}

	}

	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	private void insertarNuevoEmpleado(EmpleadoDTO empleadoDTO) {

		String sql = "insert into Empleado (legajo,nombre,tarjeta,sector,equipo) values(?,?,?,?,?)";
		jdbcTemplate.update(sql,
				new Object[] { empleadoDTO.getLegajo(),
						empleadoDTO.getNombre(), empleadoDTO.getTarjeta(),
						empleadoDTO.getSector(), empleadoDTO.getEquipo() });

		agregarDias(empleadoDTO.getDiasExcel(), empleadoDTO.getLegajo());

	}

	public List<DiasAlertaDTO> getUserDays(String legajo) {
		String sql = "select Dias.fecha,Dias.alerta from Empleado inner join Dias on Empleado.legajo = Dias.Empleado_legajo where Empleado.legajo = ?";

		List<DiasAlertaDTO> query = jdbcTemplate.query(sql,
				new Object[] { legajo }, new DiasAlertaRowMapper());
		return query;

	}

	public Empleado getEmpleadoByLegajo(String legajo) {

		String sql = "select * from Empleado where legajo=?";

		Empleado empleado = jdbcTemplate.queryForObject(sql,
				new Object[] { legajo }, new EmpleadoRowMapper());

		sql = "select * from Dias where Empleado_legajo=?";

		List<DiaExcel> query = jdbcTemplate.query(sql, new Object[] { legajo }, new DiasRowMapper());
		
		LinkedList<DiaExcel> diasExcel = new LinkedList<DiaExcel>();
		for (DiaExcel diaExcel : query) {
			diasExcel.add(diaExcel);
		}
		
		
		empleado.setDiasExcel(diasExcel);

		for (DiaExcel diaExcel : diasExcel) {

			sql = "select * from Horas where  Dias_idDias=? ";

			List<Time> query2 = jdbcTemplate.query(sql,
					new Object[] { diaExcel.getIdDia() }, new HoraRowMapper());
			diaExcel.setHoraMarcada(query2);

		}
		return empleado;

	}

	public void agregarDias(LinkedList<DiaExcel> diasExcel, String legajo) {

		String sql = "";

		for (DiaExcel dias : diasExcel) {

			boolean alerta = esImpar(dias.getHoraMarcada().size());

			sql = "insert into Dias (fecha,Empleado_legajo,alerta) values (?,?,?)";
			jdbcTemplate.update(sql,
					new Object[] { dias.getFecha(), Integer.parseInt(legajo),
							alerta });
			int lastId = jdbcTemplate
					.queryForInt("SELECT idDias from Dias ORDER BY idDias DESC LIMIT 1");

			for (Time hora : dias.getHoraMarcada()) {

				sql = "insert into Horas (hora,Dias_idDias) values (?,?)";

				jdbcTemplate.update(sql, new Object[] { hora, lastId });

			}

		}

	}

	public boolean esImpar(int iNumero) {
		if (iNumero % 2 != 0)
			return true;
		else
			return false;
	}

}
